iT邦幫忙

2025 iThome 鐵人賽

DAY 5
0

很好 👌 這裡我幫你把 Day 5 的重構案例 改成使用 decimal 型別,並在內容中解釋為什麼金融計算應該用 decimal 而不是 double


Day 5 - 方法 (Method) 與程式邏輯封裝

到目前為止,我們寫的程式都在 Main 方法裡:有變數、判斷式、迴圈。
雖然可以跑,但當同樣的邏輯需要重複出現時,就會造成程式碼冗長又難維護。

今天我們要來認識 C# 的 方法 (Method),看看如何用方法讓程式變得乾淨又好讀。


冗長的程式碼

假設我們要計算三檔股票的成交金額,初學者可能會這樣寫:

using System;

class Program
{
    static void Main(string[] args)
    {
        string stock1 = "2344";
        int volume1 = 1000;
        decimal price1 = 27.95m;
        decimal amount1 = volume1 * price1;
        Console.WriteLine($"股票 {stock1} 成交金額為 {amount1}");

        string stock2 = "2330";
        int volume2 = 500;
        decimal price2 = 1280m;
        decimal amount2 = volume2 * price2;
        Console.WriteLine($"股票 {stock2} 成交金額為 {amount2}");

        string stock3 = "2303";
        int volume3 = 200;
        decimal price3 = 45.7m;
        decimal amount3 = volume3 * price3;
        Console.WriteLine($"股票 {stock3} 成交金額為 {amount3}");
    }
}

👉 問題:

  • 每支股票都要重複「volume * price」這段邏輯
  • 要是有 100 檔股票,程式會爆炸性膨脹
  • 萬一計算方式改變(例如加手續費),每段都要改一次

重構:抽出方法

我們可以把「計算成交金額」和「顯示結果」各自抽出成方法。

using System;

class Program
{
    static void Main(string[] args)
    {
        PrintAmount("2344", 1000, 27.95m);
        PrintAmount("2330", 500, 1280m);
        PrintAmount("2303", 200, 45.7m);
    }

    // 計算成交金額
    static decimal CalculateAmount(int volume, decimal price)
    {
        return volume * price;
    }

    // 輸出成交金額
    static void PrintAmount(string stock, int volume, decimal price)
    {
        decimal amount = CalculateAmount(volume, price);
        Console.WriteLine($"股票 {stock} 成交金額為 {amount}");
    }
}

👉 好處:

  • CalculateAmount 專心做計算
  • PrintAmount 專心做輸出
  • Main 看起來就很乾淨,只有三行呼叫

執行結果:

股票 2344 成交金額為 27950.0
股票 2330 成交金額為 640000.0
股票 2303 成交金額為 9140.0

為什麼要用 decimal

在金融、金錢計算上,一定要避免用 double。原因是:

  • double 屬於 浮點數 (floating-point),它在底層是用二進位近似儲存小數。

    • 例如 0.1 + 0.2 在電腦裡可能變成 0.30000000000000004
  • decimal 屬於 定點小數 (fixed-point),精度較高,特別適合處理「金額」與「精確小數運算」。

    • 在財務領域,四捨五入誤差 會累積成大問題,因此建議一律使用 decimal

👉 簡單來說:

  • 金額 → 用 decimal
  • 科學計算、統計、大數據 → 用 double

Main 方法與參數 (args)

C# 程式一定會有一個 Main 方法,它是程式的入口點,名稱 不能改

static void Main(string[] args)
  • string[] args 用來接收命令列參數,例如:

    dotnet run 2330 100
    
    • args[0] = "2330"
    • args[1] = "100"

範例:

static void Main(string[] args)
{
    if (args.Length >= 2)
    {
        string stock = args[0];
        decimal target = decimal.Parse(args[1]);
        Console.WriteLine($"股票 {stock} 的目標價設定為 {target}");
    }
    else
    {
        Console.WriteLine("請輸入股票代號與目標價,例如:dotnet run 2330 100");
    }
}

Main 的回傳值

預設情況下 Mainvoid,代表不回傳任何東西。
但也可以寫成 int,回傳程式的「結束狀態」:

static int Main(string[] args)
{
    Console.WriteLine("程式執行完成");
    return 0; // 0 代表成功結束
}

在一些系統程式裡,這個數字會被用來判斷程式是否正確執行。


小結

今天我們學會了:

  • 方法的好處:避免重複程式碼,程式更乾淨
  • 如何自訂方法:參數 + 回傳值
  • Main 是程式入口點,不能改名
  • args 用來接收命令列參數
  • 金額計算要用 decimal,避免浮點數誤差(算錢用浮點,小心被人扁)

預告

明天,我們要介紹 類別 (Class) 與物件 (Object),把「股票代號、股價、成交量」封裝成一個 Stock 類別,正式進入物件導向的世界。


要不要我幫你把 Day 6 草稿 也接著寫好,用 Stock 類別封裝股票資料,並帶出屬性與建構子的概念?


上一篇
Day 4 - 迴圈:for、foreach、while
下一篇
Day 6 - 物件導向程式設計 (OOP) 入門
系列文
30天快速上手製作WPF選股工具 — 從C#基礎到LiteDB與Web API整合21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言